package abs.service;

import abs.dao.CompaniasDAO;
import abs.dao.RetencionesDAO;

import abs.domain.Companias;
import abs.domain.Retenciones;

import java.util.List;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import org.springframework.transaction.annotation.Transactional;

/**
 * Spring service that handles CRUD requests for Retenciones entities
 * 
 */

@Service("RetencionesService")
@Transactional
public class RetencionesServiceImpl implements RetencionesService {

	/**
	 * DAO injected by Spring that manages Companias entities
	 * 
	 */
	@Autowired
	private CompaniasDAO companiasDAO;

	/**
	 * DAO injected by Spring that manages Retenciones entities
	 * 
	 */
	@Autowired
	private RetencionesDAO retencionesDAO;

	/**
	 * Instantiates a new RetencionesServiceImpl.
	 *
	 */
	public RetencionesServiceImpl() {
	}

	/**
	 * Save an existing Companias entity
	 * 
	 */
	@Transactional
	public Retenciones saveRetencionesCompanias(String rt100cdgo, Companias related_companias) {
		Retenciones retenciones = retencionesDAO.findRetencionesByPrimaryKey(rt100cdgo, -1, -1);
		Companias existingcompanias = companiasDAO.findCompaniasByPrimaryKey(related_companias.getCo000nocia());

		// copy into the existing record to preserve existing relationships
		if (existingcompanias != null) {
			existingcompanias.setCo000nocia(related_companias.getCo000nocia());
			existingcompanias.setCo000logo(related_companias.getCo000logo());
			existingcompanias.setCo000nomb(related_companias.getCo000nomb());
			existingcompanias.setCo000nosu(related_companias.getCo000nosu());
			existingcompanias.setCo000dire(related_companias.getCo000dire());
			existingcompanias.setCo000repr(related_companias.getCo000repr());
			existingcompanias.setCo000cont(related_companias.getCo000cont());
			existingcompanias.setCo000nreg(related_companias.getCo000nreg());
			existingcompanias.setCo000clca(related_companias.getCo000clca());
			existingcompanias.setCo000mofu(related_companias.getCo000mofu());
			existingcompanias.setCo000notr(related_companias.getCo000notr());
			existingcompanias.setCo000idtr(related_companias.getCo000idtr());
			existingcompanias.setCo000meci(related_companias.getCo000meci());
			existingcompanias.setCo000mepr(related_companias.getCo000mepr());
			existingcompanias.setCo000incc(related_companias.getCo000incc());
			existingcompanias.setCo000inut(related_companias.getCo000inut());
			existingcompanias.setCo000incp(related_companias.getCo000incp());
			existingcompanias.setCo000incf(related_companias.getCo000incf());
			existingcompanias.setCo000baca(related_companias.getCo000baca());
			existingcompanias.setCo000fir1(related_companias.getCo000fir1());
			existingcompanias.setCo000fir2(related_companias.getCo000fir2());
			existingcompanias.setCo000esta(related_companias.getCo000esta());
			existingcompanias.setCo000load(related_companias.getCo000load());
			existingcompanias.setCo000fead(related_companias.getCo000fead());
			existingcompanias.setCo000lomo(related_companias.getCo000lomo());
			existingcompanias.setCo000femo(related_companias.getCo000femo());
			related_companias = existingcompanias;
		}

		retenciones.setCompanias(related_companias);
		related_companias.getRetencioneses().add(retenciones);
		retenciones = retencionesDAO.store(retenciones);
		retencionesDAO.flush();

		related_companias = companiasDAO.store(related_companias);
		companiasDAO.flush();

		return retenciones;
	}

	/**
	 * Return all Retenciones entity
	 * 
	 */
	@Transactional
	public List<Retenciones> findAllRetencioness(Integer startResult, Integer maxRows) {
		return new java.util.ArrayList<Retenciones>(retencionesDAO.findAllRetencioness(startResult, maxRows));
	}

	/**
	 * Delete an existing Retenciones entity
	 * 
	 */
	@Transactional
	public void deleteRetenciones(Retenciones retenciones) {
		retencionesDAO.remove(retenciones);
		retencionesDAO.flush();
	}

	/**
	 */
	@Transactional
	public Retenciones findRetencionesByPrimaryKey(String rt100cdgo) {
		return retencionesDAO.findRetencionesByPrimaryKey(rt100cdgo);
	}

	/**
	 * Delete an existing Companias entity
	 * 
	 */
	@Transactional
	public Retenciones deleteRetencionesCompanias(String retenciones_rt100cdgo, String related_companias_co000nocia) {
		Retenciones retenciones = retencionesDAO.findRetencionesByPrimaryKey(retenciones_rt100cdgo, -1, -1);
		Companias related_companias = companiasDAO.findCompaniasByPrimaryKey(related_companias_co000nocia, -1, -1);

		retenciones.setCompanias(null);
		related_companias.getRetencioneses().remove(retenciones);
		retenciones = retencionesDAO.store(retenciones);
		retencionesDAO.flush();

		related_companias = companiasDAO.store(related_companias);
		companiasDAO.flush();

		companiasDAO.remove(related_companias);
		companiasDAO.flush();

		return retenciones;
	}

	/**
	 * Load an existing Retenciones entity
	 * 
	 */
	@Transactional
	public Set<Retenciones> loadRetencioness() {
		return retencionesDAO.findAllRetencioness();
	}

	/**
	 * Save an existing Retenciones entity
	 * 
	 */
	@Transactional
	public void saveRetenciones(Retenciones retenciones) {
		Retenciones existingRetenciones = retencionesDAO.findRetencionesByPrimaryKey(retenciones.getRt100cdgo());

		if (existingRetenciones != null) {
			if (existingRetenciones != retenciones) {
				existingRetenciones.setRt100cdgo(retenciones.getRt100cdgo());
				existingRetenciones.setRt100desc(retenciones.getRt100desc());
				existingRetenciones.setRt100tipo(retenciones.getRt100tipo());
				existingRetenciones.setRt100niv1(retenciones.getRt100niv1());
				existingRetenciones.setRt100niv2(retenciones.getRt100niv2());
				existingRetenciones.setRt100niv3(retenciones.getRt100niv3());
				existingRetenciones.setRt100niv4(retenciones.getRt100niv4());
				existingRetenciones.setRt100niv5(retenciones.getRt100niv5());
				existingRetenciones.setRt100ctac(retenciones.getRt100ctac());
				existingRetenciones.setRt100porc(retenciones.getRt100porc());
				existingRetenciones.setRt100timo(retenciones.getRt100timo());
				existingRetenciones.setRt100esta(retenciones.getRt100esta());
				existingRetenciones.setRt100load(retenciones.getRt100load());
				existingRetenciones.setRt100fead(retenciones.getRt100fead());
				existingRetenciones.setRt100lomo(retenciones.getRt100lomo());
				existingRetenciones.setRt100femo(retenciones.getRt100femo());
			}
			retenciones = retencionesDAO.store(existingRetenciones);
		} else {
			retenciones = retencionesDAO.store(retenciones);
		}
		retencionesDAO.flush();
	}

	/**
	 * Return a count of all Retenciones entity
	 * 
	 */
	@Transactional
	public Integer countRetencioness() {
		return ((Long) retencionesDAO.createQuerySingleResult("select count(o) from Retenciones o").getSingleResult()).intValue();
	}
}
